package PureFactoryClasses;

import Classes.Agenda;
import Classes.Contacto;
import Classes.Empresa;
import Classes.Persona;
import Filtros.Comparadores.Comparador;
import java.util.ArrayList;

/**
 *
 * @author Juampi
 */
public class ApController {
    public static final String EMPRESA = "E";
    public static final String PERSONA = "P";
    public static final int QUE_ES = 0;
    public static final int NOMBRE = 1;
    public static final int APELLIDO = 2;
    public static final int FECHA_NAC_DIA = 3;
    public static final int FECHA_NAC_MES = 4;
    public static final int FECHA_NAC_AÑO = 5;
    public static final int CEL = 6;
    public static final int EMAIL = 7;
    public static final int DIR = 8;
    public static final int CP = 9;
    public static final int TEL = 10;
    public static final int EMPRESA_RAZON_SOC = 1;
    public static final int EMPRESA_URL = 2;
    public static final int EMPERSA_RUBROS = 3;
    public static final int EMPRESA_EMAIL = 4;
    public static final int EMPREA_DIR = 5;
    public static final int EMPRESA_CP = 6;
    public static final int EMPRESA_TEL = 7;
    private static ApController instance = null;
    Agenda agenda = Agenda.getInstance();

    private ApController() {
    }

    public static ApController getInstance() {
        if (instance == null) {
            instance = new ApController();

        }
        return instance;
    }

    
    public boolean agregarPersona(Persona persona) {
        return (agenda.addContacto(persona));
    }

    public void ordenarContactos(){
        this.agenda.ordenarContactos();
    }
    /*
     * Agrega una empresa a la lista de contactos, y lo devuelve para que pueda
     * ser agregado al modelo (de la tabla)
     */
    public boolean agregarEmpresa(Empresa empresa) {
        return (agenda.addContacto(empresa));
    }

    public ArrayList<ArrayList<Object>> cargarTablaContactos() {        
        agenda.ordenarContactos();
        return readTable(agenda.getAllContactos());
    }

    public ArrayList<ArrayList<Object>> cargarTablaContactos(Comparador filtro) {        
        agenda.ordenarContactos();
        if (filtro == null) {
            return cargarTablaContactos();
        } else {
            return readTable(agenda.filtrarContactos(filtro));
        }
    }

    private ArrayList<ArrayList<Object>> readTable(ArrayList<Contacto> listabase) {
        ArrayList<ArrayList<Object>> contactos = new ArrayList<ArrayList<Object>>();

        for (int i = 0; i < listabase.size(); i++) {
            Contacto contacto = listabase.get(i);
            ArrayList<Object> infoContacto = new ArrayList<Object>();
            if (contacto.getTipo() == Contacto.ES_EMPRESA) {
                infoContacto.add(EMPRESA);
            } else {
                infoContacto.add(PERSONA);
            }
            infoContacto.add(contacto);
            contactos.add(infoContacto);
        }
        return contactos;
    }

    public boolean modificarPersona(Persona persona) {
        return (agenda.saveModified((Contacto) persona));
    }

    public boolean modificarEmpresa(Empresa empresa) {
        return (agenda.saveModified((Contacto) empresa));
    }

    public boolean borrarContacto(Contacto contacto) {
        return (agenda.deleteContact(contacto));
    }

    public ArrayList<String> listaDeCategorias(){
        return agenda.getCategoriasUsadas();
    }
    
    public void inicializarAplicacion() {
        agenda.inicializarAgenda();
    }
}
